textview: Improve touch popover interaction
authorCarlos Garnacho <carlosg@gnome.org>
Fri, 16 May 2014 15:27:42 +0000 (17:27 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Fri, 23 May 2014 17:54:31 +0000 (19:54 +0200)
Presses alternatively show and dismiss the popover, the popover is still
always shown invariably after any dragging happens (either text selection,
or dragging a text handle)

gtk/gtktextview.c

index 34ef9a48aa6c82886c3bcd9eec34fcc0bc8b8f44..0d9fef9ac1d8cd456dabdace4ded2b4ce2ee0147 100644 (file)
@@ -4789,7 +4789,11 @@ gtk_text_view_handle_drag_finished (GtkTextHandle         *handle,
                                     GtkTextHandlePosition  pos,
                                     GtkTextView           *text_view)
 {
-  gtk_text_view_selection_bubble_popup_set (text_view);
+  if (text_view->priv->selection_bubble &&
+      gtk_widget_get_visible (text_view->priv->selection_bubble))
+    gtk_text_view_selection_bubble_popup_unset (text_view);
+  else
+    gtk_text_view_selection_bubble_popup_set (text_view);
 
   if (text_view->priv->magnifier_popover)
     gtk_widget_hide (text_view->priv->magnifier_popover);
@@ -5074,7 +5078,6 @@ gtk_text_view_multipress_gesture_pressed (GtkGestureMultiPress *gesture,
   gtk_gesture_set_sequence_state (GTK_GESTURE (gesture), sequence,
                                   GTK_EVENT_SEQUENCE_CLAIMED);
   gtk_text_view_reset_blink_time (text_view);
-  gtk_text_view_selection_bubble_popup_unset (text_view);
 
 #if 0
   /* debug hack */
@@ -6997,6 +7000,8 @@ gtk_text_view_drag_gesture_update (GtkGestureDrag *gesture,
     gdk_threads_add_timeout (50, selection_scan_timeout, text_view);
   g_source_set_name_by_id (text_view->priv->scroll_timeout, "[gtk+] selection_scan_timeout");
 
+  gtk_text_view_selection_bubble_popup_unset (text_view);
+
   if (is_touchscreen)
     {
       _gtk_text_view_ensure_text_handles (text_view);
@@ -7037,18 +7042,21 @@ gtk_text_view_drag_gesture_end (GtkGestureDrag *gesture,
   if (priv->magnifier_popover)
     gtk_widget_hide (priv->magnifier_popover);
 
-  /* Check whether the drag was cancelled rather than finished */
-  if (!gtk_gesture_handles_sequence (GTK_GESTURE (gesture), sequence))
-    return;
-
   event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), sequence);
   device = gdk_event_get_source_device (event);
   is_touchscreen = test_touchscreen ||
     gdk_device_get_source (device) == GDK_SOURCE_TOUCHSCREEN;
 
-  if (is_touchscreen)
+  if (priv->selection_bubble &&
+      gtk_widget_get_visible (priv->selection_bubble))
+    gtk_text_view_selection_bubble_popup_unset (text_view);
+  else if (is_touchscreen)
     gtk_text_view_selection_bubble_popup_set (text_view);
 
+  /* Check whether the drag was cancelled rather than finished */
+  if (!gtk_gesture_handles_sequence (GTK_GESTURE (gesture), sequence))
+    return;
+
   if (clicked_in_selection &&
       !gtk_drag_check_threshold (GTK_WIDGET (text_view), start_x, start_y, x, y))
     {